package com.hzlj.position.locate.common.common;

import cn.hutool.core.util.ObjectUtil;
import com.fz.common.base.core.date.DateUtils;
import com.google.common.collect.Lists;
import com.hzlj.position.locate.common.enums.SignStatus;
import lombok.Data;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author lifh
 * @date 2023/4/6 21:54
 **/
@Data
public class ReportTimesDTO extends ArrayList<ReportTimesDTO.Item> {
//    /**
//     * 补签时间
//     */
//    public static int MINUTES = 60;
//    /**
//     * 是否开通补签
//     */
//    public static Boolean OPEN = false;


    public Item match(String endTime) {
        for (Item item : this) {
            if (item.getEndTime().equals(endTime)) {
                return item;
            }
        }
        return null;
    }

    /**
     * 获取配置的时间段
     * 1、时间段内
     * 2、补签时间段内+已经成功发送补签请求+没有补签记录
     *
     * @param complement 是否可以补签
     */
    public Item match(Boolean complement,
                      Integer complementMinutes,
                      Date reportTime) {
        for (Item item : this) {
            if (item.checkInTime(reportTime)) {
                return item;
            }
            if (Boolean.TRUE.equals(complement)
                    && item.checkInComplementTime(reportTime, complementMinutes)
                    && item.complementSuccess()
                    && !item.complementSigned()) {
                return item;
            }
        }
        return null;
    }


    @Data
    public static class ItemPosition {
        /**
         * 签到结果(默认空)
         */
        private String signStatus;
        /**
         * 上报时间
         */
        private Date reportTime;
        /**
         * 上报地址
         */
        private String reportAddress;
        /**
         * 纬度
         */
        private String latitude;
        /**
         * 经度
         */
        private String longitude;
        /**
         * 上报的现场图片
         */
        private String fileIds;
        /**
         * 补签通知的发送情况
         * null：未发送
         * true:已发送
         * false:发送失败
         */
        private Boolean complement;
        /**
         * 补签通知的发送时间
         */
        private Date complementTime;
        /**
         * 补签通知的发送失败原因
         */
        private String complementFailMsg;

        /**
         * signStatusText
         */
        public String getSignStatusText() {
            if (ObjectUtil.isEmpty(signStatus)) {
                return null;
            }
            return SignStatus.of(signStatus).getStatusText();
        }
    }


    @Data
    public static class Item {
        /**
         * 开始时间:10:00
         */
        private String startTime;
        /**
         * 结束时间:12:00
         */
        private String endTime;
        /**
         * 位置列表
         */
        private List<ItemPosition> positions;
        /**
         * 特殊情况说明
         */
        private String handleReason;

        public Item() {
            positions = Lists.newArrayList();
        }

        public Item(String startTime, String endTime) {
            this.startTime = startTime;
            this.endTime = endTime;
            positions = Lists.newArrayList();
        }

        /**
         * 生成新的position还是取最新的
         */
        public ItemPosition createOrGetPosition(Date reportTime) {
            ItemPosition position = new ItemPosition();
            //没有记录、或者在时间段内，则直接生成一个(允许重复签到)
            if (ObjectUtil.isEmpty(positions) || this.checkInTime(reportTime)) {
                positions.add(position);
                return position;
            }
            //补签时间段:只记录一次签到（已经判断了满足补签要求：见match）
            return positions.get(positions.size() - 1);
        }


        /**
         * 最新的补签通知是否有发送请求
         */
        public boolean complemented() {
            if (ObjectUtil.isEmpty(positions)) {
                return false;
            }
            Boolean complement = positions.get(positions.size() - 1).getComplement();
            return ObjectUtil.isNotEmpty(complement);
        }

        /**
         * 最新的补签通知是否发送成功
         */
        public boolean complementSuccess() {
            if (ObjectUtil.isEmpty(positions)) {
                return false;
            }
            Boolean complement = positions.get(positions.size() - 1).getComplement();
            return Boolean.TRUE.equals(complement);
        }

        /**
         * 是否已经做了补签
         */
        public boolean complementSigned() {
            //没有发送通知，则说明没有补签
            if (!complementSuccess()) {
                return false;
            }
            ItemPosition position = positions.get(positions.size() - 1);
            return ObjectUtil.isNotEmpty(position.getReportTime());
        }

        /**
         * 是否做了签到：包含补签
         */
        public boolean signed() {
            return ObjectUtil.isNotEmpty(positions)
                    && positions.stream().anyMatch(e -> e.getReportTime() != null);
        }

        /**
         * 最新的签到结果(默认空)
         */
        public String signStatus() {
            if (ObjectUtil.isEmpty(positions)) {
                return null;
            }
            return positions.get(positions.size() - 1).getSignStatus();
        }

        /**
         * 是否在时间段内
         */
        public boolean checkInTime(Date reportTime) {
            Date start = DateUtils.parseFixedHHmm(reportTime, startTime);
            Date end = DateUtils.parseFixedHHmm(reportTime, endTime);
            return start.compareTo(reportTime) <= 0 && end.compareTo(reportTime) >= 0;
        }

        /**
         * 是否在补签的时间段内(0< millsDiff <= minutes)
         *
         * @param minutes 补签的时间限制
         */
        public boolean checkInComplementTime(Date reportTime, Integer minutes) {
            Date maxEndTime = DateUtils.parseFixedHHmm(reportTime, endTime);
            long millsDiff = reportTime.getTime() - maxEndTime.getTime();
            return millsDiff > 0 && millsDiff <= minutes * 60 * 1000;
        }

    }
}
